package pl.wroc.pwr.mss.server.dao;

import java.io.Serializable;
import java.util.List;

import pl.wroc.pwr.mss.logic.domain.AbstractEntity;

/**
 * Generyczne dao operujace na dowolnych encjach dziedziczacych po
 * {@link AbstractEntity}.
 * 
 * @author mjagus
 * 
 * @param <T> Typ encji ktora dao ma obslugiwac
 * @param <I> Typ identyfikatora encji
 */
public interface GenericDao<T extends AbstractEntity, I extends Serializable>
{
    /**
     * Znajduje encje o podanym id.
     * 
     * @param id Identyfikator
     * @return Encja o podanym id lub <code>null</code> jesli encja o podanym id
     * nie istnieje.
     */
    T findById(I id);

    /**
     * Zwraca wszystkie encje obslugiwane przez to dao.
     * 
     * @return Lista wszystkich encji obslugiwanych przez to dao
     */
    List<T> findAll();

    /**
     * Zlicza wszystkie encje obslugiwane przez to dao.
     * 
     * @return Liczba wszystkich encji znajdujacych sie w bazie
     */
    int countAll();

    /**
     * Usuwa encje.
     * 
     * @param entity Encja do usuniecia
     */
    void remove(T entity);

    /**
     * Zapisuje dana encje w bazie.
     * 
     * @param entity Dana encja
     * @return Ta sama encja po dokonanym zapisie
     */
    T save(T entity);

    /**
     * Zwraca nazwe klasy encji na ktorej operuje to dao.
     * 
     * @return Nazwa klasy encji
     */
    String getClassName();

    /**
     * Sprawdza czy istnieje encja zawierajaca pole o zadanej wartosci.
     * 
     * @param field Nazwa pola
     * @param value Zadana wartosc pola
     * @return <code>true</code> jesli takowa encja istnieje, <code>false</code>
     * w przeciwnym wypadku
     */
    boolean entityByFieldExists(String field, String value);

    /**
     * Zwraca liste encji zawierajacych pole o zadanej wartosci.
     * 
     * @param field Nazwa pola
     * @param value Zadana wartosc pola
     * @return Lista encji
     */
    List<T> findEntityByFieldValue(String field, String value);
}
